<?php
// +----------------------------------------------------------------------
// | Author: wyd 2025/9/27
// | DESC: 
// +----------------------------------------------------------------------

declare (strict_types=1);

require_once __DIR__ . '/../../vendor/autoload.php';

/**************************************************************************************************************/
//1、直接使用容器,通过get方法直接获取对象实例
//class Db{
//    public function say()
//    {
//        echo 'this is DB class';
//    }
//}
//
//
////直接通过get获取对象实例；
//$builder = new \DI\Container();
//$obj = $builder->get(Db::class);
//$obj->say();



/**************************************************************************************************************/
//2,配置和构建容器
//class User{
//    public function say()
//    {
//        echo 'this is User class';
//    }
//}
////创建构建器实例
//$builder = new \DI\ContainerBuilder();
//// 构建容器, 此方法不接收任何参数
//$container = $builder->build();
//$obj = $container->get(User::class);
//$obj->say();


//2.1添加配置
use function DI\factory;
class User{
    //php8 构造器属性提升
    public function __construct(protected $name)
    {
    }

    public function say()
    {
        echo $this->name;;
    }
}

class Log
{
}

//创建构建器实例
$builder = new \DI\ContainerBuilder();


/********1.数组值********/
//$builder->addDefinitions([
//    'app.name'=> 'my app',  //简单zhi
//    'create_time'=> function () {   //工厂函数，创建并返回对象的函数，用于控制对象的创建过程
//        return new DateTime();
//    },
//    User::class=>\DI\create()->constructor('张三1'),  //指定构造函数的参数
//    Log::class=>\DI\create(Log::class)                //绑定映射关系
//]);
//
//$container = $builder->build();
//$user = $container->get(User::class);
//$user->say();
//
//$app = $container->get('app.name');
//echo $app;


/********2.配置文件********/
//容器会自动调用 DatabaseFactory::create() 来创建 Database 实例并注入。
class DatabaseFactory {
    private $config;

    // 通过构造函数注入配置（假设容器中已经有配置项）
    public function __construct($config) {
        $this->config = $config;
    }

    public function create() {
        $host = $this->config['database.host'];
        $port = $this->config['database.port'];
        // ...
        return new Database($host, $port);
    }
}

return [
    'database.host' => env('DB_HOST', 'localhost'),
    'database.port' => env('DB_PORT', 3306),
    Database::class => \DI\factory([DatabaseFactory::class, 'create']),
];

// 加载文件
$builder->addDefinitions('config/database.php');
$container = $builder->build();



/********3.回调函数配置********/
$builder->addDefinitions(function(\DI\Definition\Source\DefinitionSource $source) {
    $definitions = [];
    // 尝试获取已存在的定义
    try {
        $logLevelDefinition = $source->getDefinition('log.level');
        // 如果找到了定义，可以基于它做进一步配置
        if ($logLevelDefinition) {
            // 注意：这里不能直接获取值，只能获取定义对象
            $definitions['cache.ttl'] = 3600; // 基于日志级别设置缓存TTL
        }
    } catch (\DI\NotFoundException $e) {
        // 定义不存在时的处理
        $definitions['cache.ttl'] = 1800;
    }

    return $definitions;
});



